home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
CUGUK
/
APPLICAT
/
C034.ZIP
/
DBQTUP.C
< prev
next >
Wrap
Text File
|
2010-11-01
|
9KB
|
498 lines
/* SDB - operations on tuples */
#include "bdscio.h"
#include "dbqdefs.h"
int insert()
{
struct scan *sptr;
struct attribute *aptr;
char aname[ANSIZE+1],avalue[STRINGMAX+1];
int tcnt,astart,i;
if (db_token() == ID)
db_ntoken();
else
strcpy(dbv_tstring,"current");
if (!db_flush(0))
return (FALSE);
if (!(sptr = db_ropen(dbv_tstring)))
return (FALSE);
for (tcnt = 0; ; tcnt++) {
if (tcnt)
printf("----\n");
astart = 1;
for (i = 0; i < NATTRS; i++) {
aptr = &sptr->sc_relation->rl_header.hd_attrs[i];
if (!aptr->at_name[0])
break;
strncpy(aname,aptr->at_name,ANSIZE);
aname[ANSIZE] = 0;
db_prompt(NULL,NULL);
while (TRUE) {
if (!dbv_ifp) {
if (strlen(aname) < 8)
printf("%s\t\t",aname);
else
printf("%s\t",aname);
inbrack(aptr->at_size,aptr->at_type,aptr->at_scale);
}
if (db_gline(avalue))
break;
}
if (!i && !avalue[0])
break;
db_aput(aptr,&sptr->sc_tuple[astart],avalue);
astart += aptr->at_size;
}
if (!avalue[0])
break;
if (!db_rstore(sptr)) {
db_rclose(sptr);
return (FALSE);
}
}
db_rclose(sptr);
pcount(tcnt,"inserted");
return (TRUE);
}
int delete()
{
struct sel *slptr;
struct srel *srptr;
int tcnt;
if (!(slptr = db_retrieve(NULL)))
return (FALSE);
for (tcnt = 0; db_fetch(slptr); tcnt++)
for (srptr = slptr->sl_rels; srptr != NULL;srptr = srptr->sr_next)
if (!db_rdelete(srptr->sr_scan)) {
db_done(slptr);
return (FALSE);
}
db_done(slptr);
pcount(tcnt,"deleted");
return (TRUE);
}
int update()
{
struct sel *slptr;
struct sattr *saptr;
struct attribute *aptr;
char aname[ANSIZE+1],avalue[STRINGMAX+1],*ap;
int tcnt;
if (!(slptr = db_select(NULL)))
return (FALSE);
if (!db_flush(0)) {
db_done(slptr);
return (FALSE);
}
for (tcnt = 0; db_fetch(slptr); tcnt++) {
if (tcnt)
printf("----\n");
for (saptr = slptr->sl_attrs; saptr ; saptr = saptr->sa_next) {
aptr = saptr->sa_attr;
strncpy(aname,aptr->at_name,ANSIZE);
aname[ANSIZE] = 0;
db_aget(aptr,saptr->sa_aptr,avalue);
for (ap = avalue; isspace(*ap); ap++)
;
if (!dbv_ifp)
if (strlen(aname) < 8)
printf("%s\t\t= %s\n",aname,ap);
else
printf("%s\t= %s\n",aname,ap);
db_prompt(NULL,NULL);
while (TRUE) {
if (!dbv_ifp) {
if (strlen(aname) < 8)
printf("%s\t\t ",aname);
else
printf("%s\t ",aname);
inbrack(aptr->at_size,aptr->at_type,aptr->at_scale);
}
if (db_gline(avalue))
break;
}
if (avalue[0]) {
db_aput(aptr,saptr->sa_aptr,avalue);
saptr->sa_srel->sr_update = TRUE;
}
}
db_update(slptr);
}
db_done(slptr);
pcount(tcnt,"updated");
return (TRUE);
}
inbrack(fldsize,fldtype,fldscale)
int fldsize,fldscale; char fldtype;
{
int i;
i = fldsize;
if (fldtype == TNUM)
putchar('<');
else
putchar('[');
while (i--) putchar(' ');
if (fldtype == TNUM) {
putchar('>');
if (fldscale) printf(" %d\b\b",fldscale);
}
else
putchar(']');
putchar('\b');
while (fldsize--) putchar('\b');
}
int print()
{
struct sel *slptr;
char *ffp;
FILE *ofp;
int tcnt;
if (!using(&ffp,".fmt"))
return (FALSE);
if (!(slptr = db_select(NULL)))
return (FALSE);
if (!db_to(&ofp,".rep")) {
db_done(slptr);
return (FALSE);
}
dbv_page = 0;
dbv_lnct = dbv_pgln;
if (ffp)
tcnt = form(ofp,slptr,ffp);
else
tcnt = table(ofp,slptr);
db_done(slptr);
if (ffp) {
CFREE(ffp);
}
if (ofp != STDOUT) {
putc(CPMEOF,ofp);
fclose(ofp);
}
pcount(tcnt,"found");
return (TRUE);
}
int select()
{
struct sel *slptr;
struct relation *rptr;
struct sattr *saptr;
char *aname,*tbuf;
int tcnt,abase,i;
if (!(slptr = db_select(NULL)))
return (FALSE);
if (!(rptr = db_rcreate("current"))) {
db_done(slptr);
return(FALSE);
}
for (saptr = slptr->sl_attrs; saptr; saptr = saptr->sa_next) {
if (!(aname = saptr->sa_name))
aname = saptr->sa_aname;
if (!db_rcattr(rptr,aname,saptr->sa_attr->at_type,
saptr->sa_attr->at_size,saptr->sa_attr->at_scale)) {
CFREE(rptr);
db_done(slptr);
return (FALSE);
}
}
if (!db_rcheader(rptr)) {
db_done(slptr);
return (FALSE);
}
if (!(tbuf = CALLOC(rptr->rl_size))) {
db_rcdone(rptr);
RETERR(INSMEM)
}
tbuf[0] = ACTIVE;
for (tcnt = 0; db_fetch(slptr); tcnt++) {
abase = 1;
for (saptr = slptr->sl_attrs; saptr != NULL; saptr = saptr->sa_next) {
for (i = 0; i < saptr->sa_attr->at_size; i++)
tbuf[abase + i] = saptr->sa_aptr[i];
abase += i;
}
if (cwrite(rptr->rl_fd,tbuf,rptr->rl_size) != rptr->rl_size) {
db_rcdone(rptr);
CFREE(tbuf);
RETERR(INSBLK)
}
rptr->rl_tcnt++;
rptr->rl_tmax++;
}
db_done(slptr);
if (!db_rcdone(rptr))
return (FALSE);
pcount(tcnt,"found");
return (TRUE);
}
pcount(tcnt, mess)
int tcnt; char *mess;
{
if (tcnt)
printf("[ %d records %s ]\n",tcnt,mess);
else
printf("[ No records %s ]\n",mess);
return (TRUE);
}
int db_to(pfp,ext)
FILE **pfp; char *ext;
{
*pfp = STDOUT;
if (db_token() != INTO)
return (TRUE);
db_ntoken();
if (db_ntoken() == ID)
strcat(dbv_tstring,ext);
else if (dbv_token != STRING)
{ RETERR(SYNTAX) }
if (db_scmp(dbv_tstring,"lst.rep") == 0) {
*pfp = STDLST;
return (TRUE);
}
*pfp = &obuf;
fcreat(dbv_tstring,&obuf);
if (*pfp == -1)
{ RETERR(OUTCRE) }
return (TRUE);
}
int using(pfp,ext)
char **pfp; char *ext;
{
FILE *ffd;
unsigned ffsize;
*pfp = NULL;
if (db_token() != USING)
return (TRUE);
db_ntoken();
if (db_ntoken() == ID)
strcat(dbv_tstring,ext);
else if (dbv_token != STRING)
{ RETERR(SYNTAX) }
if ((ffd = open(dbv_tstring,0)) == -1) {
RETERR(INPFNF)
}
ffsize = cfsize(ffd);
if ((*pfp = CALLOC(ffsize*128)) == NULL) {
close(ffd);
RETERR(INSMEM)
}
if (read(ffd,*pfp,ffsize) != ffsize) {
close(ffd);
CFREE(*pfp);
RETERR(INPFNF)
}
close(ffd);
return(TRUE);
}
int table(fp,slptr)
FILE *fp; struct sel *slptr;
{
int tcnt;
for (tcnt = 0; db_fetch(slptr); tcnt++) {
if (!tcnt)
db_thead(fp,slptr);
db_tentry(fp,slptr);
}
if (tcnt)
db_tfoot(fp,slptr);
return (tcnt);
}
int form(ofp,slptr,ffp)
FILE *ofp; struct sel *slptr; char *ffp;
{
char aname[ANSIZE+1];
char *anptr;
int ch,tcnt,rsf,kbrep;
char *fbs,*fhs; /* form buffer,header start */
fhs = fbs = ffp; /* stash them */
kbrep = 0; /* indicate o.k. */
if ((ch = *ffp) == '%') { /* see if heading */
*ffp = 0; /* make it a null */
ffp++;
while (((ch = *ffp++) != '%') && (ch != CPMEOF))
;
if (ch == '%') {
ffp--;
*ffp++ = 0; /* make it a null */
fbs = ffp; /* not if eof! */
}
}
dbv_lnct = 0; /* force first heading */
for (tcnt = 0; db_fetch(slptr); tcnt++) {
if (dbv_lnct == 0) {
dbv_lnct = dbv_pgln;
dbv_page++;
ffp = fhs;
} else
ffp = fbs; /* reposition at start */
dbv_lnct--;
while ((ch = *ffp++) != CPMEOF)
if ((ch == '<') || (ch == '>')) {
rsf = FALSE;
anptr = &aname;
while (((ch = *ffp++) != '>') && (ch != '<')
&& (ch != CPMEOF))
if (!isspace(ch))
*anptr++ = ch;
if (ch == '>') rsf = TRUE;
*anptr = 0;
if (aname[0] == '#')
fprintf(ofp,"%d",dbv_page);
else
put_avalue(ofp,slptr,aname,rsf);
}
else if (ch == '?') { /* indicates pause */
printf("Press ENTER to continue, ^Z to abort\n");
kbrep = getchar();
}
else
putc(ch,ofp);
if (kbrep == -1) break;
}
return (tcnt);
}
put_avalue(fp,slptr,aname,rsf)
char *fp; struct sel *slptr; char *aname; int rsf;
{
struct sattr *saptr;
char *saname;
int i,fpd;
for (saptr = slptr->sl_attrs; saptr ; saptr = saptr->sa_next) {
if (!(saname = saptr->sa_name))
saname = saptr->sa_aname;
if (!db_scmp(saname,aname))
break;
}
if (!saptr) {
fprintf(fp,"<*****>");
return;
}
fpd = FALSE;
for (i = 0; i < saptr->sa_attr->at_size; i++)
if (saptr->sa_aptr[i]) {
if (saptr->sa_aptr[i] == ' ') {
if ((rsf) || (fpd))
putc(saptr->sa_aptr[i],fp);
}
else {
putc(saptr->sa_aptr[i],fp);
fpd = TRUE;
}
}
else
if (rsf)
putc(' ',fp);
}
}
else {
putc(saptr->sa_aptr[i],fp);
fpd = TRUE;